home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_13_11
/
phillip2
/
wtiff.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-06-07
|
21KB
|
719 lines
/**********************************************
*
* file d:\cips\wtiff.c
*
* Functions: This file contains
* create_file_if_needed
* create_allocate_tiff_file
* write_array_into_tiff_image
* write_line
* insert_short_into_buffer
* insert_long_into_buffer
* round_off_image_size
* does_not_exist
*
* Purpose:
* These functions create TIFF image files
* on disk and insert a ROWSxCOLS array
* into a tiff image already stored on disk.
*
* External Calls:
* rtiff.c - seek_to_first_line
* seek_to_end_of_line
* tiff.c - read_tiff_header
*
* Modifications:
* 29 January 1991 - created
* 28 March 1993 - replaced open, lseek
* etc. with fopen, fseek, etc.
* 10 May 1993 - added a number of tags
* to make the TIFF files I create
* TIFF 6.0 Gray Scale image compliant.
*
*********************************************/
#include "cips.h"
/**********************************************
*
* create_file_if_needed(...
*
* This function creates a file on disk
* if it does not exist. The out file is
* patterned after the in file.
*
***********************************************/
create_file_if_needed(in_name, out_name, out_image)
char in_name[], out_name[];
short out_image[ROWS][COLS];
{
int length, width;
struct tiff_header_struct image_header;
if(does_not_exist(out_name)){
printf("\n\n output file does not exist %s",
out_name);
read_tiff_header(in_name, &image_header);
round_off_image_size(&image_header,
&length, &width);
image_header.image_length = length*ROWS;
image_header.image_width = width*COLS;
create_allocate_tiff_file(out_name, &image_header,
out_image);
} /* ends if does_not_exist */
} /* ends create_file_if_needed */
/**********************************************
*
* create_alllocate_tiff_file(...
*
* This function creates a file on disk that will be
* large enough to hold a tiff image. The input
* tiff_header_struct describes the desired tiff file.
* This function writes the tiff header and then
* writes a blank image array out to disk the proper
* number of times. This has the effect of allocating
* the correct number of bytes on the disk.
*
* There will be 18 entries in the IFD.
* The image data will begin at byte 296.
* I will use LSB first data.
* I will have one strip for the entire image.
* Black is zero.
* The component values for the image are CHUNKY
* (Planer configuration = 1).
*
***************************************************/
create_allocate_tiff_file(file_name,
image_header, image)
char file_name[];
short image[ROWS][COLS];
struct tiff_header_struct *image_header;
{
char buffer[12], long_buffer[50];
FILE *image_file;
int bytes_written,
i,
j,
l,
w;
long k;
/***************************************
*
* Create the image file in binary mode
* for both reading and writing.
*
****************************************/
image_file = fopen(file_name, "wb");
/***************************************
*
* Write out the first 8 bytes of the
* header. The meaning of the
* bytes (HEX) is:
* 0-1 = 49 49 - LSB first
* 2-3 = 2A 00 - version #
* 4-7 = 08 00 00 00 - go to offset
* 8 for the first
* Image File
* Directory
*
****************************************/
buffer[0] = 0x49;
buffer[1] = 0x49;
buffer[2] = 0x2A;
buffer[3] = 0x00;
buffer[4] = 0x08;
buffer[5] = 0x00;
buffer[6] = 0x00;
buffer[7] = 0x00;
bytes_written = fwrite(buffer, 1, 8, image_file);
printf("\n wrote %d bytes", bytes_written);
/***************************************
*
* Write out the first 2 bytes of the
* Image File Directory. These tell
* the number of entries in the IFD.
*
****************************************/
buffer[0] = 0x12;
buffer[1] = 0x00;
bytes_written = fwrite(buffer, 1, 2, image_file);
printf("\n wrote %d bytes", bytes_written);
/***************************************
*
* Write out the entries into the
* Image File Directory.
*
****************************************/
/* New Subfile Type */
buffer[0] = 0xFE;
buffer[1] = 0x00;
buffer[2] = 0x03;
buffer[3] = 0x00;
buffer[4] = 0x01;
buffer[5] = 0x00;
buffer[6] = 0x00;
buffer[7] = 0x00;
buffer[8] = 0x00;
buffer[9] = 0x00;
buffer[10] = 0x00;
buffer[11] = 0x00;
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Subfile Type */
buffer[0] = 0xFF;
buffer[1] = 0x00;
buffer[2] = 0x03;
buffer[3] = 0x00;
buffer[4] = 0x01;
buffer[5] = 0x00;
buffer[6] = 0x00;
buffer[7] = 0x00;
buffer[8] = 0x01;
buffer[9] = 0x00;
buffer[10] = 0x00;
buffer[11] = 0x00;
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Image Width */
insert_short_into_buffer(buffer, 0, 256);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8,
image_header->image_width);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Image Length */
insert_short_into_buffer(buffer, 0, 257);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8,
image_header->image_length);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Bits Per Sample */
insert_short_into_buffer(buffer, 0, 258);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8,
image_header->bits_per_pixel);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Compression - None */
insert_short_into_buffer(buffer, 0, 259);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8, 1);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Photometric Interpretation */
/* set to 1 because BLACK is ZERO */
insert_short_into_buffer(buffer, 0, 262);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8, 1);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Strip Offset */
/* start after software name at 296 */
insert_short_into_buffer(buffer, 0, 273);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_into_buffer(buffer, 8, 296);
bytes_written = fwrite(buffer, 1, 12, image_file);
printf("\n wrote %d bytes", bytes_written);
/* Samples per Pixel */
insert_short_into_buffer(buffer, 0, 277);
insert_short_into_buffer(buffer, 2, 3);
insert_short_into_buffer(buffer, 4, 1);
insert_short_i